# 导入所需的库
import pymysql  # MySQL数据库连接库
from movie_dao import MovieDAO  # 导入电影数据访问对象
import logging  # 日志模块

# 配置日志系统
logging.basicConfig(level=logging.INFO,  # 设置日志级别为INFO
                   format='%(asctime)s - %(levelname)s - %(message)s')  # 设置日志格式：时间-级别-消息
logger = logging.getLogger(__name__)  # 获取当前模块的日志记录器

class RatingDAO:
    """评分分布数据访问对象，用于获取电影评分的分布情况"""
    
    def __init__(self):
        """初始化评分DAO对象"""
        # 复用 MovieDAO 的数据库配置
        self.movie_dao = MovieDAO()  # 创建电影DAO实例用于数据库连接

    def get_rating_distribution(self):
        """获取评分分布数据的主方法"""
        conn = None  # 数据库连接对象
        cursor = None  # 数据库游标对象
        try:
            conn = self.movie_dao.get_connection()  # 获取数据库连接
            cursor = conn.cursor()  # 创建数据库游标

            # SQL查询：统计每个评分的电影数量
            sql = """
            SELECT 
                rating,  # 评分
                COUNT(*) as count  # 每个评分的电影数量
            FROM movies 
            WHERE rating IS NOT NULL AND rating != ''  # 过滤掉空评分
            GROUP BY rating  # 按评分分组
            ORDER BY CAST(rating AS DECIMAL(3,1)) DESC  # 按评分降序排序
            """
            
            cursor.execute(sql)  # 执行SQL查询
            results = cursor.fetchall()  # 获取所有查询结果
            logger.info(f"SQL查询结果: {results}")  # 记录查询结果
            
            # 将查询结果转换为字典格式
            rating_distribution = {}  # 初始化评分分布字典
            for row in results:  # 遍历查询结果
                rating = row['rating']  # 获取评分
                count = row['count']  # 获取该评分的电影数量
                # logger.info(f"处理数据: rating={rating}, count={count}")  # 调试日志
                rating_distribution[str(rating)] = count  # 将评分和数量添加到字典中
            
            # logger.info(f"最终返回的评分分布数据: {rating_distribution}")  # 调试日志
            return rating_distribution  # 返回评分分布数据

        except Exception as e:  # 捕获所有可能的异常
            logger.error(f"获取评分分布数据时出错: {str(e)}")  # 记录错误信息
            logger.exception("详细错误信息:")  # 记录详细的异常堆栈
            return {}  # 发生错误时返回空字典
        
        finally:  # 确保资源正确释放
            if cursor:
                cursor.close()  # 关闭数据库游标
            if conn:
                conn.close()  # 关闭数据库连接 